/**
 * @Author 12629
 * @Description： 浪费一个空间判断
 */
class MyCircularQueue {
    public int[] elem;  // 用于存储队列元素的数组
    public int front;   // 指向队列头部的指针
    public int rear;    // 指向队列尾部的指针（指向下一个插入位置）
    public MyCircularQueue(int k) {
        elem = new int[k+1];
        // 创建一个大小为k+1的数组，因为循环队列的实现需要浪费一个空间来区分队列满和队列空的状态
    }
    //入队列
    public boolean enQueue(int value) {
        if(isFull()) {  // 如果队列已满，无法入队
            return false;
        }
        elem[rear] = value;  // 在rear位置插入新元素
        rear = (rear+1)%elem.length;  // 循环更新rear指针
        return true;
    }

    //出队列
    public boolean deQueue() {
        if(isEmpty()) {  // 如果队列为空，无法出队
            return false;
        }
        front = (front+1)%elem.length;  // 循环更新front指针
        // 注：只需移动front指针，不需要实际删除元素（会被后续入队操作覆盖）
        return true;
    }

    //获取队头元素
    public int Front() {
        if(isEmpty()) {  // 队列为空时返回-1
            return -1;
        }
        return elem[front];  // 返回front指向的元素
    }

    //获取队尾元素
    public int Rear() {
        if(isEmpty()) {  // 队列为空时返回-1
            return -1;
        }
        int index = (rear == 0) ? elem.length-1 : rear-1;  // 计算最后一个元素的位置
        /*因为rear指向下一个插入位置，所以队尾元素是rear-1的位置
          需要特殊处理当rear=0时的情况（循环到数组末尾）*/
        return elem[index];
    }

    public boolean isEmpty() {
        return rear == front;  // 当rear和front相等时队列为空
    }

    public boolean isFull() {
        return (rear+1)%elem.length == front;  // 下一个rear位置等于front时队列满
        // 这也是为什么构造函数要分配k+1的空间（实际只能存储k个元素）
    }

}